home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Development / AmigaTalk / system / ARexx.st < prev    next >
Encoding:
Text File  |  2004-01-31  |  9.9 KB  |  335 lines

  1. "-----------------------------------------------------------------------"
  2. " ARexxTags Class is a Singleton Class that gives the User access to    "
  3. " the various Action codes that the ARexxPort Class uses in the         "
  4. " setRMAction: method.                                                  "
  5. ""
  6. " ALL singleton classes MUST contain the following:                     "
  7. ""
  8. "   the methods:  isSingleton AND privateSetup     AND                  "
  9. "                 uniqueInstance Class instance variable.               "
  10. ""
  11. " NORMAL USAGE (Example): "
  12. "   atags        <- ARexxTags new.                                      "
  13. "   myActionCode <- atags arexxTag: #RXCOMM.                            "
  14. "   myActionCode <- myActionCode + atags arexxTag: #RXFF_STRING.        "
  15. "-----------------------------------------------------------------------"
  16.  
  17. Class ARexxTags :Dictionary ! uniqueInstance !
  18. [
  19.    isSingleton
  20.  
  21.      ^ true  
  22. |  
  23.    privateNew ! newinstance !
  24.  
  25.      newinstance <- super new.
  26.  
  27.      ^ newinstance
  28. |
  29.    new
  30.  
  31.      ^ (self privateSetup)
  32. |
  33.    arexxTag: aKey
  34.  
  35.      ^ self at: aKey
  36. |
  37.    privateSetup
  38.  
  39.      (uniqueInstance isNil)
  40.        ifTrue: [uniqueInstance <- self privateNew.
  41.   
  42.                 " The primary Action Codes: "
  43.  
  44.                 self at: #RXCOMM    put: 16r01000000. " a command-level invocation "
  45.                 self at: #RXFUNC    put: 16r02000000. " a function call            "
  46.                 self at: #RXCLOSE   put: 16r03000000. " close the REXX server      "
  47.                 self at: #RXQUERY   put: 16r04000000. " query for information      "
  48.                 self at: #RXADDFH   put: 16r07000000. " add a function host        "
  49.                 self at: #RXADDLIB  put: 16r08000000. " add a function library     "
  50.                 self at: #RXREMLIB  put: 16r09000000. " remove a function library  "
  51.                 self at: #RXADDCON  put: 16r0A000000. " add/update a ClipList string "
  52.                 self at: #RXREMCON  put: 16r0B000000. " remove a ClipList string     "
  53.                 self at: #RXTCOPN   put: 16r0C000000. " open the trace console       "
  54.                 self at: #RXTCCLS   put: 16r0D000000. " close the trace console      "
  55.  
  56.                 " Command modifier flag bits: "
  57.  
  58.                 self at: #RXFF_NOIO    put: 16r10000.  " suppress I/O inheritance?   "
  59.                 self at: #RXFF_RESULT  put: 16r20000.  " result string expected?     "
  60.                 self at: #RXFF_STRING  put: 16r40000.  " program is a 'string file'? "
  61.                 self at: #RXFF_TOKEN   put: 16r80000.  " tokenize the command line?  "
  62.                 self at: #RXFF_NONRET  put: 16r100000. " a 'no-return' message?      "
  63.  
  64.                 " Misc entries: "
  65.                 self at: #RXCODEMASK   put: 16rFF000000.
  66.                 self at: #RXARGMASK    put: 16r0000000F.
  67.  
  68.                ].
  69.         ^ self
  70. ]
  71.  
  72. "-----------------------------------------------------------------------"
  73. " This Class is used to create arguments for the ARexxPort Class.       "
  74. "-----------------------------------------------------------------------"
  75.  
  76. Class ARexxArg :Object ! private myValue !
  77. [
  78.    new
  79.  
  80.      super error: 'Use "new: aString" to instantiate ARexxArg!'.
  81.  
  82.      ^ nil
  83. |   
  84.    new: aString ! length !
  85.  
  86.      length  <- aString size.
  87.      
  88.      myValue <- aString.
  89.  
  90.      private <- <primitive 211 3 aString length>.
  91.  
  92.      ^ self
  93. |
  94.    dispose
  95.  
  96.      " DO NOT use the instance after this method! "
  97.      <primitive 211 4 private>.
  98.      
  99.      <primitive 250 5 0 private>.
  100.  
  101.      ^ nil
  102. |
  103.    length
  104.  
  105.      ^ <primitive 211 5 private>
  106. |
  107.    value
  108.  
  109.      ^ myValue
  110. ]
  111.  
  112. "-----------------------------------------------------------------------"
  113. " ARexxPort Class allows the User to communicate with rexxmast,either   "
  114. " within AmigaTalk programs, or to any defined arexxPort known to Exec. "
  115. " The intent of this Class is only to allow communication between ARexx "
  116. " & AmigaTalk, not full access to all the functions/commands available  "
  117. " in ARexx.  This would result in a duplication of operations in other  "
  118. " classes (such as file I/O), so just the methods that are necessary to "
  119. " send & receive messages via ARexx ports is contained herein.          "
  120. ""
  121. "   WARNING!  WARNING!  Danger, Will Robinson!                          "
  122. "   You had better know what size & what Message any outside System     "
  123. "   ARexxPort expects to see & respond to!                              "
  124. ""
  125. " NOTES: "
  126. "   1. argument is NOT the same as String Class.                       "
  127. "-----------------------------------------------------------------------"
  128.  
  129. Class ARexxPort :Object ! private myRexxMsg portName !
  130. [
  131.    open: arexxPortName 
  132.  
  133.      portName  <- arexxPortName.
  134.  
  135.      private   <- <primitive 211 1 arexxPortName>.
  136.  
  137.      myRexxMsg <- <primitive 211 25 private>.
  138.         
  139.      ^ private  " ^ self "
  140. |
  141.    errorIs: errorNumber
  142.  
  143.      ^ <primitive 211 2 errorNumber>
  144. |
  145.    defaultExtension  
  146.  
  147.      " What is the default file extension for ARexx 
  148.      * scripts (normally '.rexx')? 
  149.      "
  150.      ^ <primitive 211 6>
  151. |
  152.    fileExtension: newExtString
  153.  
  154.      <primitive 211 20 private newExtString>
  155. |
  156.    fileExtension
  157.  
  158.      ^ <primitive 211 21 private>
  159. |
  160.    findARexxPort: portName
  161.  
  162.      " This method returns a msgPortObj or nil on failure. "
  163.  
  164.      ^ <primitive 211 23 portName>      
  165. |
  166.    selectARexxPort
  167.  
  168.      " Display a ListView of all known message Ports so that
  169.      * the User can select a msgPortObj to send messages to.
  170.      "
  171.      ^ <primitive 250 0 8>
  172. |
  173.    createRexxMsg: msgPortObj extension: extString port: newPortName
  174.  
  175.      " This method returns a rexxMsgObj or nil if there is a problem.
  176.      * Use this method to create a message for a foreign ARexx port.
  177.      "
  178.      ^ <primitive 211 7 msgPortObj extString newPortName>
  179. |     
  180.    sendOutMessage: aString to: rexxMsgObj
  181.  
  182.      " Be sure to use 'port setRMAction: myActionCode' first!
  183.      * Returns true if successful, false on failure.          
  184.      "
  185.      ^ <primitive 211 24 private rexxMsgObj aString> 
  186. |
  187.    disposeRexxMsg: rexxMsgObj
  188.  
  189.      " Do NOT use the rexxMsgObj after this method! " 
  190.      <primitive 211 8 rexxMsgObj>.
  191.      
  192.      <primitive 250 5 0 rexxMsgObj>.
  193.      
  194.      ^ nil
  195. |
  196.    clearRexxMsg: rexxMsgObj count: c
  197.  
  198.      " Release one or more arguments from the rexxMsgObj.
  199.      * This method is not normally needed.
  200.      "
  201.      <primitive 211 9 rexxMsgObj c>
  202. |
  203.    fillRexxMsg: rexxMsgObj count: c mask: m
  204.  
  205.      " Convert & install arguments into the rexxMsgObj.
  206.      * The argument array must already be set to either Strings
  207.      * or Integers.  The count argument c specifies the number
  208.      * of fields to convert, beginning with the first one.
  209.      * Bits 0 - 15 of the mask argument m specify whether the
  210.      * corresponding argument is a String (bit clear) or an
  211.      * Integer (bit set).
  212.      * This method is not normally needed.
  213.      "
  214.      ^ <primitive 211 10 rexxMsgObj c m>
  215. |      
  216.    isRexxMsg: chkThisObject
  217.  
  218.      " Returns true or false. "
  219.      ^ <primitive 211 11 chkThisObject>
  220. |
  221.    sendRexxCmd: aString
  222.  
  223.      " Be sure to use 'port setRMAction: myActionCode' first! " 
  224.      ^ <primitive 211 12 private aString>
  225.    arrayToArgs: inputArray
  226.  
  227.      " Each element of the inputArray should be a String. 
  228.      * This method will store the arguments away.
  229.      * The ARexx system only has space for 16 arguments.
  230.      " 
  231.      (inputArray size > 16)
  232.         ifTrue: [ 'inputArray too large for ARexxPort method!' print.
  233.                   ^ nil ].
  234.  
  235.      <primitive 211 13 private inputArray>
  236. |
  237.    getRexxMsg
  238.  
  239.      ^ <primitive 211 14 private>
  240. |
  241.    setRMAction: actionCode
  242.  
  243.      " Normally, the actionCode should be:
  244.      * #RXCOMM + #RXFF_STRING (See ARexxTags Class notes)
  245.      "
  246.      <primitive 211 15 private actionCode>
  247. |
  248.    getPrimaryResult
  249.  
  250.      ^ <primitive 211 16 private>
  251. |
  252.    getSecondaryResult
  253.  
  254.      ^ <primitive 211 17 private>
  255. |
  256.    setArgument: argNumber for: rexxMsgObj to: argument
  257.  
  258.      " This method is for setting the arguments for external
  259.      * rexxMsg Objects only.  Valid range for argNumber is 
  260.      * 1 to 16.  a Value of 1 will be overwritten by 
  261.      * sendOutMessage:to: or by sendRexxCmd:, so just 
  262.      * use this method for setting arguments 2 through 16 only.
  263.      " 
  264.      (argNumber > 1 and: [argNumber <= 16])
  265.         ifTrue: [ <primitive 211 18 rexxMsgObj (argNumber - 1) argument> ].
  266.      
  267.      (argNumber <= 1)
  268.         ifTrue: [ <primitive 211 18 rexxMsgObj 0 argument> ].
  269.  
  270.      (argNumber > 16)
  271.         ifTrue: [ 'argNumber value out of range for setArgument:to:' print ]
  272. |
  273.    setArgument: argNumber to: argument
  274.  
  275.      " For setting this instance's arguments only. "
  276.      self setArgument: argNumber for: myRexxMsg to: argument
  277. |
  278.    getArgument: argNumber
  279.  
  280.      (argNumber > 1 and: [argNumber <= 16])
  281.         ifTrue: [ <primitive 211 19 private (argNumber - 1)> ].
  282.      
  283.      (argNumber <= 1)
  284.         ifTrue: [ <primitive 211 19 private 0> ].
  285.  
  286.      (argNumber > 16)
  287.         ifTrue: [ 'argNumber value out of range for getArgument:' print ]
  288. |
  289.    checkRexxMsg
  290.  
  291.      " NOT TESTED YET! "
  292.      " Returns true if the message is from ARexx: "
  293.      ^ <primitive 211 26 private>
  294. |
  295.    getRexxVar: varName into: resultString
  296.  
  297.      " NOT TESTED YET! "
  298.      " Get the value of a variable from a running ARexx program. 
  299.      * A return of zero indicates success, any other value is
  300.      * an error indication as follows:
  301.      *    3  means Insufficient Storage,
  302.      *    9  means the String is too long, and
  303.      *    10 means the Message is Invalid
  304.      "
  305.      ^ <primitive 211 27 private varName resultString>
  306. |
  307.    setRexxVar: varName with: valueString
  308.  
  309.      " NOT TESTED YET! "
  310.      " Set the value of a variable from a running ARexx program
  311.      * to the valueString.
  312.      * A return of zero indicates success, any other value is
  313.      * an error indication as follows:
  314.      *    3  means Insufficient Storage,
  315.      *    9  means the String is too long, and
  316.      *    10 means the Message is Invalid
  317.      "
  318.      ^ <primitive 211 28 private varName valueString>
  319. |
  320.    portNameIs
  321.  
  322.      ^ <primitive 211 22 private>
  323. |
  324.    close
  325.  
  326.      <primitive 211 0 private>.
  327.  
  328.      <primitive 250 5 0 private>.
  329.      
  330.      myRexxMsg <- nil.     
  331.  
  332.      ^ nil
  333. ]
  334.